From 6e20f30bec742bd048d0aa5f9c53fcfa4a1cf39c Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Mon, 13 Nov 2006 11:02:37 -0700 Subject: [PATCH] [IA64] Fix HVM interrupts on IPF Xen has changed to set-irq-level hypercall from shared-memory PIC stat. This patch makes IPF accomodate this change Signed-off-by: Anthony Xu --- .../arch/ia64/xen/xcom_privcmd.c | 3 +++ xen/arch/ia64/vmx/vlsapic.c | 22 ++++++++++++++++ xen/arch/ia64/vmx/vmx_hypercall.c | 26 +++++++++++++++++++ xen/include/asm-ia64/vmx.h | 1 + xen/include/asm-ia64/vmx_platform.h | 4 +-- 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c index ad1737c5b9..51cbb9f4c0 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c @@ -579,6 +579,9 @@ xencomm_privcmd_hvm_op(privcmd_hypercall_t *hypercall) case HVMOP_set_param: argsize = sizeof(xen_hvm_param_t); break; + case HVMOP_set_irq_level: + argsize = sizeof(xen_hvm_set_irq_level_t); + break; default: printk("%s: unknown HVMOP %d\n", __func__, cmd); return -EINVAL; diff --git a/xen/arch/ia64/vmx/vlsapic.c b/xen/arch/ia64/vmx/vlsapic.c index 5594e52f70..3a6d85a36a 100644 --- a/xen/arch/ia64/vmx/vlsapic.c +++ b/xen/arch/ia64/vmx/vlsapic.c @@ -666,3 +666,25 @@ void vmx_vexirq(VCPU *vcpu) { generate_exirq (vcpu); } + + +void vmx_vioapic_set_irq(struct domain *d, int irq, int level) +{ + unsigned long flags; + + spin_lock_irqsave(&d->arch.arch_vmx.virq_assist_lock, flags); + vioapic_set_irq(d, irq, level); + spin_unlock_irqrestore(&d->arch.arch_vmx.virq_assist_lock, flags); +} + +int vmx_vlapic_set_irq(VCPU *v, uint8_t vec, uint8_t trig) +{ + int ret; + int running = test_bit(_VCPUF_running, &v->vcpu_flags); + + ret = vmx_vcpu_pend_interrupt(v, vec); + vcpu_unblock(v); + if (running) + smp_send_event_check_cpu(v->processor); + return ret; +} diff --git a/xen/arch/ia64/vmx/vmx_hypercall.c b/xen/arch/ia64/vmx/vmx_hypercall.c index 2252ad6401..dcb571e042 100644 --- a/xen/arch/ia64/vmx/vmx_hypercall.c +++ b/xen/arch/ia64/vmx/vmx_hypercall.c @@ -34,6 +34,7 @@ #include #include #include +#include long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) @@ -78,6 +79,31 @@ do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) break; } + case HVMOP_set_irq_level: + { + struct xen_hvm_set_irq_level op; + struct domain *d; + + if (copy_from_guest(&op, arg, 1)) + return -EFAULT; + + if (!IS_PRIV(current->domain)) + return -EPERM; + + d = find_domain_by_id(op.domid); + if (d == NULL) + return -ESRCH; + + rc = -EINVAL; + if (is_hvm_domain(d)) { + vmx_vioapic_set_irq(d, op.irq, op.level); + rc = 0; + } + + put_domain(d); + break; + } + default: gdprintk(XENLOG_INFO, "Bad HVM op %ld.\n", op); rc = -ENOSYS; diff --git a/xen/include/asm-ia64/vmx.h b/xen/include/asm-ia64/vmx.h index 4e0971278a..344ef44b95 100644 --- a/xen/include/asm-ia64/vmx.h +++ b/xen/include/asm-ia64/vmx.h @@ -55,6 +55,7 @@ extern void vmx_relinquish_guest_resources(struct domain *d); extern void vmx_relinquish_vcpu_resources(struct vcpu *v); extern void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err); extern void vmx_send_assist_req(struct vcpu *v); +extern void vmx_vioapic_set_irq(struct domain *d, int irq, int level); static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu) { diff --git a/xen/include/asm-ia64/vmx_platform.h b/xen/include/asm-ia64/vmx_platform.h index 7239fd1793..878961ef04 100644 --- a/xen/include/asm-ia64/vmx_platform.h +++ b/xen/include/asm-ia64/vmx_platform.h @@ -56,10 +56,10 @@ extern uint64_t dummy_tmr[]; #define VLAPIC_ID(l) (uint16_t)(((l)->vcpu->arch.privregs->lid) >> 16) #define VLAPIC_IRR(l) ((l)->vcpu->arch.privregs->irr[0]) struct vlapic *apic_round_robin(struct domain *d, uint8_t vector, uint32_t bitmap); -extern int vmx_vcpu_pend_interrupt(struct vcpu *vcpu, uint8_t vector); +extern int vmx_vlapic_set_irq(struct vcpu *v, uint8_t vec, uint8_t trig); static inline int vlapic_set_irq(struct vlapic *t, uint8_t vec, uint8_t trig) { - return vmx_vcpu_pend_interrupt(t->vcpu, vec); + return vmx_vlapic_set_irq(t->vcpu, vec, trig); } enum ioapic_irq_destination_types { -- 2.30.2